
st.chat_input:學生在畫面輸入文字並送出。app.py 把學生輸入的訊息 (user_message)、目前編輯器裡的程式碼 (code)、主題與題目整合包成 payload。學號:主題 建立唯一的 thread_id,確保不同學生或不同主題之間的對話狀態相互獨立。graph.invoke(payload, config) 將資料送入 LangGraph。agents/tutor.py 中的 ask_tutor() 函式,背後調用 Gemini API。reply、卡關進展 progress、診斷出的觀念弱點 misconceptions)。messages)、卡關輪數 (stuck_count)、提示等級 (hint_level) 等狀態。store.py 的 record_misconceptions()。students/{學號}/misconceptions/{code})。MemorySaver 會自動將這一輪更新後的完整 TutorState 序列化並存進指定的 thread_id 記憶體空間中。st.rerun():強迫 Streamlit 從第 1 行開始重新執行 app.py 腳本。store.py: load_misconceptions(),從 Firestore 抓取剛寫入的最新弱點清單並渲染出統計數據。graph.get_state(config).values,直接讀取剛剛 Checkpointer 存下的 messages 對話紀錄並印在畫面上。